#ifndef THRIFT_CLIENT_H
#define THRIFT_CLIENT_H

#include <string>
#include <NodeClient.h>
#include <mutex>

class ThriftClient
{
    std::string controlUUID;
    std::string savepath;
    std::unique_ptr<Thrift::NodeClientClient> client;
    std::mutex thriftMut;
  public:
    void Boot(std::string addr,int port);
    /**
     * @brief 获取设备列表
     * @return 设备UUID列表
     */
    std::vector<std::string> GetDeviceList();
    /**
     * @brief 设置接下来操作的UUID
     * @warning 只是一个简单的记录并不作合法性检查，如果UUID不存在会导致其他接口报错
     *
     * @param uuid 设备UUID
     */
    void SetSelectUUID(const std::string& uuid);
    /**
     * @brief 开始拍摄
     */
		void StartCollegeImage();
    /**
     * @brief 停止拍摄
     */
		void StopCollegeImage();
  /**
   * @brief 获取设备拍摄状态
   *
   * @return `true`正在拍摄，`false`停止拍摄
   */
		bool GetCollegeImageStatus();
    /**
     * @brief 设置图像存储路径
     * @note 不会验证存储路径的合法性，如果有错误，会在`StartSaveImage()`中抛出错误
     *
     * @param path 图像存储路径
     */
		void SetImageSavePath(std::string path);
  /**
   * @brief 开始存储图像
   * @note 要求先执行以下步骤：
   * 1. 设置路径`SetImageSavePath()`
   * @return 实际存储路径（已弃用）
   */
		std::string StartSaveImage();
  /**
   * @brief 停止存储图像
   */
		void StopSaveImage();
  /**
   * @brief 获取图像存储状态
   *
   * @return `true`正在存图,`false`停止存图
   */
		bool GetSaveImageStatus();
  /**
   * @brief 设置帧率限制
   *
   * @param fps 限制帧率
   */
		void SetImageFPSRate(long fps);
  /**
   * @brief 使能图像帧率限制
   *
   * @param status 是否使能
   */
		void SetImageFPSControl(bool status);
    /**
     * @brief 设置曝光时间
     *
     * @param time 曝光时间
     */
		void SetExposureTime(double time);
    /**
     * @brief 获取曝光时间
     *
     * @return 曝光时间
     */
		double GetExposureTime();
  /**
   * @brief 设置图像高度
   *
   * @param value 图像高度
   */
		void SetImageHeight(int64_t value);
  /**
   * @brief 设置图像宽度
   *
   * @param value 图像宽度
   */
		void SetImageWidth(int64_t value);
  /**
   * @brief 获取图像高度
   *
   * @return 图像高度
   */
		int64_t GetImageHeight();
  /**
   * @brief 获取图像宽度
   *
   * @return 图像宽度
   */
		int64_t GetImageWidth();
  /**
   * @brief 设置图像X偏移量
   *
   * @param value X偏移量
   */
		void SetImageOffsetX(int64_t value);
  /**
   * @brief 设置图像Y偏移量
   *
   * @param value Y偏移量
   */
		void SetImageOffsetY(int64_t value);
  /**
   * @brief 获取图像X偏移量
   *
   * @return X偏移量
   */
		int64_t GetImageOffsetX();
  /**
   * @brief 获取图像Y偏移量
   *
   * @return Y偏移量
   */
		int64_t GetImageOffsetY();
  /**
   * @brief 获取帧率限制
   *
   * @return 帧率限制值
   */
		double GetCollegeFrameRate();
  /**
   * @brief 设置触发模式
   *
   * @param value `true`使能触发,`false`停止触发
   */
		void SetTriggerMode(bool value);
  /**
   * @brief 获取触发状态
   *
   * @return `true`触发使能，`false`停止触发
   */
		bool GetTriggerMode();
};

#endif
